﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FluoCalcIRS
{
    /// <summary>
    /// 自带的类，继承自Form
    /// </summary>
    public partial class DataShow : Form
    {
        public DataShow()
        {
            InitializeComponent();
        }

        private void DataShow_Load(object sender, EventArgs e)
        {
            //this.Text = "研五荧光算法数据窗口";
            //IniDataView.Enabled = false;    
            this.Text = "原始数据 & 计算结果——FluoCalc for i-Reader S";
            tbCalcResult.Text = "";
            lbWarning.Text = "数据表名为\"sheet2\"中并且第一行必须是标题（类似数据库），故数据大小应该是(181*column)。";
        }

        /// <summary>
        /// 选择数据源："Excel文件|*.xlsx; *xls; *xlsm; *.csv"；
        /// 数据要求放入sheet2中，并且(1,:)是标题，存入DataGridView中也会是标题；
        /// 故数据大小应该是(181*column)。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_getData_Click(object sender, EventArgs e)
        {
            //必须注意的是，以下的格式是尝试之后调试出来的，不要轻易动，不然位置错误了又得重新调
            IniDataView.DataSource = null;              //每次打开清空内容            
            tbCalcResult.Text = "列\\类" + "   \t" + "CX" + "  \t" + "CY" + "      \t" + "TX" + "  \t" + "TY" + "      \t" +
                "base1" + "      \t" + "base2" + "      \t" + "base3" + "      \t" + "base4" + "      \t" +
                "sumCBase" + "      \t" + "sumTBase" + "      \t" + "Tap" + "  \t" + "\r\n";

            DataSet ds = new DataSet();                 //定义一个数据集
            ds = GetData();                             //调用GetData()函数，用来获取EXCEL表格中的表
            if (ds == null)                             //判断取得的数据是否为null，查看GetData的备注说明便明白了
            {
                tbCalcResult.Text = "Warning：未选择合适数据便关闭对话框";
                return;                                 //没有选定表或者是空表，跳出click
            }
            IniDataView.DataSource = ds.Tables[0];      //取出数据集缓存中的第一张表            

            CalcForFour calc = new CalcForFour(); //类的实例化
            string[] strOd;                             //获取计算的结果
            int row = IniDataView.RowCount - 1;         //数据容器中表头会占一行，数据格式要求中已经提及
            int column = IniDataView.ColumnCount;       //这两行：取出数据的实际行和列

            List<double> data = new List<double>();     //data用来存放取出的每一列数据，这是一个测试样本

            //读取样本操作，每一列是一个样本哦，一共column个样本
            for (int col = 0; col < column; col++)
            {
                for (int r = 0; r < row; r++)
                {
                    string str = IniDataView.Rows[r].Cells[col].Value.ToString();
                    data.Add(double.Parse(str));        //List<T>的特性决定了，List/ArrayList/List<T>
                }

                //取出了第col+1列数据，即第col+1个样本，进行分析
                calc.SetData(data);               //FluoCalcMethon类的属性FluoData的复制，其实是给私有变量fluodata赋值
                strOd = calc.CalFluo();                 //类的公有成员函数调用

                //以下是display的过程
                string strout = "第" + (col + 1) + "列" + "    \t";
                foreach (string i in strOd)
                {
                    strout += i;
                    strout += "    \t";
                }
                //textBox1.Text = strOd.ToString();
                tbCalcResult.AppendText(strout + "\r\n");
                //tbCalcResult.Text = tbCalcResult.Text + strout;
                data.Clear();                           //data的定义是一个泛型List，所以每次要清空一下
            }
        }

        private DataSet GetData()
        {
            //打开文件，还记得这种写法吗？其实也可以转换为file.Filter...
            OpenFileDialog file = new OpenFileDialog()
            {
                //Filter = "图片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
                Filter = "Excel文件|*.xlsx; *xls; *xlsm; *.csv",
                InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                Multiselect = false                     //是否允许多选
            };

            if (file.ShowDialog() == DialogResult.Cancel)
            {
                MessageBox.Show("你怎么都不选择数据源呢？\r即将返回请重选或退出", "空数据源", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return null;
            }

            //判断文件后缀
            var path = file.FileName;
            string fileSuffix = System.IO.Path.GetExtension(path);
            if (string.IsNullOrEmpty(fileSuffix))
            {
                return null;
            }

            using (DataSet ds = new DataSet())          //这是个什么写法啊？
            {
                //判断Excel文件是2003版本还是2007版本
                string connString = "";
                if (fileSuffix == ".xls")
                {
                    connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + " Data Source=" + path + "; Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
                }
                else
                {
                    connString = "Provider=Microsoft.ACE.OLEDB.12.0;" + " Data Source=" + path + "; Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
                }

                ////读取文件
                //string sql_select = "SELECT * FROM [Sheet2$]";
                //using (OleDbConnection conn = new OleDbConnection(connString))

                //using (OleDbDataAdapter cmd = new OleDbDataAdapter(sql_select, conn))
                //{
                //    cmd.Fill(ds); //给ds中添加数据
                //    conn.Close();
                //}

                //建立数据库的连接对象
                //OleDbConnection conn = new OleDbConnection()
                //{
                //    ConnectionString = connString
                //};
                OleDbConnection conn = new OleDbConnection(connString);
                OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM [Sheet2$]", conn);
                oda.Fill(ds);
                conn.Close();

                if (ds == null || ds.Tables.Count <= 0)
                {
                    return null;
                }
                return ds;
            }
        }
    }
}
